package com.jysz.certificate.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

/**
 *  解析json数据
 *  
 * @author <a href="mailto:javaengine@outlook.com">Kaca Rich</a>
 *
 */
public class JsonUtil {

	
	/**
	 * 解析json  支持{"key":"value"}
	 * @param jsonStr
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, String> getJsonDataToMap(String jsonStr) {
		if(StringUtils.isBlank(jsonStr)){
			return null;
		}
		JSONObject obj = JSONObject.fromObject(jsonStr);
		Map<String, String> jsonMap = (Map<String, String>) JSONObject.toBean(obj, Map.class);
		return jsonMap;
	}
	
	/**
	 * 解析json  支持[{"key":"value"},{"key":"value"}]
	 * @param jsonStr
	 * @return
	 */
	public static List<Map<?, ?>> getJsonToMap(String jsonStr) {
		if(StringUtils.isBlank(jsonStr)){
			return null;
		}
		List<Map<?, ?>> list = new ArrayList<Map<?, ?>>();
		JSONArray array = JSONArray.fromObject(jsonStr);
		if (array != null) {
			for (int i = 0; i < array.size(); i++) {
				JSONObject jsonObj = (JSONObject) array.get(i);
				Map<?, ?> map = (Map<?, ?>) JSONObject.toBean(jsonObj, Map.class);
				list.add(map);
			}
		}
		return list;
	}
	
	/**
	 * json解析时的特殊字符转义
	 * @param jsonField
	 * @return
	 */
	public static String JsonEscape(String jsonField){
		if(StringUtils.isNotBlank(jsonField)){
			jsonField = jsonField.replace("$br$;", "\r\n");//换行符
			return jsonField;
		}
		return null;
	}
	 /**
	  * @param object
	  *             任意对象
	  * @return java.lang.String
	  */           
	public static String objectToJson(Object object) {
		StringBuilder json = new StringBuilder();
		if (object == null) {
			json.append("\"\"");
			} else if (object instanceof String || object instanceof Integer) { 
				json.append("\"").append(object.toString()).append("\""); 
				} else { 
					json.append(beanToJson(object)); 
					}                 
		return json.toString();               
		}                         
	  /**
	   * 功能描述:传入任意一个 javabean 对象生成一个指定规格的字符串
	   * @param bean 
	   *             bean对象
	   * @return String
	   */           
	public static String beanToJson(Object bean) {
		StringBuilder json = new StringBuilder(); 
		json.append("{");                  
		PropertyDescriptor[] props = null;
		try {                      
			props = Introspector.getBeanInfo(bean.getClass(), Object.class).getPropertyDescriptors();
			} catch (IntrospectionException e) {
				
			}                  
		if (props != null) {
			for (int i = 0; i < props.length; i++) {
				try {
					String name = objectToJson(props[i].getName());
					String value = objectToJson(props[i].getReadMethod().invoke(bean));
					json.append(name);
					json.append(":");
					json.append(value); 
					json.append(",");
					} catch (Exception e) {
						
					}
				}                       
			json.setCharAt(json.length() - 1, '}');
			} else {                      
				json.append("}");
				}  
		return json.toString();  
		}                 
	  /** 
	   *
	   * 功能描述:通过传入一个列表对象,调用指定方法将列表中的数据生成一个JSON规格指定字符串
	   *            
	   * @param list 列表对象 
	   * @return java.lang.String
	   */          
		public static String listToJson(List<?> list) {    
			StringBuilder json = new StringBuilder();  
			json.append("[");                 
			if (list != null && list.size() > 0) {                      
				for (Object obj : list) {                           
					json.append(objectToJson(obj));                           
					json.append(",");                      
					}                       
				json.setCharAt(json.length() - 1, ']');                  
				} else {                       
					json.append("]");                   
					}                  
			return json.toString();               
			}   
	
}
